<?php

/**
 * 控制器基类
 * 控制器用来控制执行流程, 根据用户请求调用不同的模型。
 * 一般不需要写业务代码和操作数据库。
 */
abstract class controller
{
    
    protected $app = null;
    protected $controller = null;
    protected $task = null;
    
    protected $ajax = null; // 暂存 ajax 数据

    
    public function __construct()
    {
    }

    /**
     * 设置应用名
     * @param string $app 应用名
     */
    public function set_app($app)
    {
        $this->app = $app;
    }

    /**
     * 设置控制器名
     * @param string $controller 控制器名
     */
    public function set_controller($controller)
    {
        $this->controller = $controller;
    }

    /**
     * 执行指定任务函数
     * @param string $task 任务函数名
     */
    public function execute($task)
    {
        $this->task = $task;
        $this->$task();
    }

    /**
     * 设置 ajax 数据
     * @param string $name 名称
     * @param string $value 值 (可以是数组或对象)
     */
    protected function set_ajax($name, $value)
    {
        $this->ajax->$name = $value;
    }

    /**
     * ajax 输出
     */
    protected function ajax()
    {
        header('Content-type: application/json');
        echo json_encode($this->ajax);
        exit();
    }

    /**
     * 转向， 并传递信息 $msg 
     * @param string $url 转向目标网址
     * @param string $msg 信息内容
     * @param string $type 信息类型, $type : notice:提示   / warning:警告    / error:错误
     */
    protected function redirect($url, $msg = null, $type = 'notice')
    {
        if ($msg !== null) $this->set_message($msg, $type);
        header('location:' . $url);
        exit();
    }

    /**
     * 设置转向时要传递的信息
     * @param string $msg 信息内容
     * @param string $type 信息类型, $type : notice:提示   / warning:警告    / error:错误
     */
    protected function set_message($msg, $type = 'notice')
    {
        $message = new stdClass();
        $message->type = $type;
        $message->body = $msg;
        
        $session = bone::get_session();
        $session->set('_message', $message);
    }

    /**
     * 获取当前应用的一个配置文件
     * @param string $config 配置文件名
     * @return object
     */
    protected function get_config($config = null)
    {
        if ($config === null) $config = $this->app;
        return bone::get_app_config($this->app, $config);
    }

    /**
     * 获取当前应用的一个后台配置文件
     * @param string $config 配置文件名
     * @return object
     */
    protected function get_admin_config($config = null)
    {
        if ($config === null) $config = $this->app;
        return bone::get_admin_app_config($this->app, $config);
    }

    /**
     * 获取当前应用下的一个表
     * @param string $table 表名
     * @return object
     */
    protected function get_table($table = null)
    {
        if ($table === null) $table = $this->controller;
        return bone::get_table($this->app, $table);
    }

    /**
     * 获取当前后台应用下的一个表
     * @param string $table 表名
     * @return object
     */
    protected function get_admin_table($table = null)
    {
        if ($table === null) $table = $this->controller;
        return bone::get_admin_table($this->app, $table);
    }

    /**
     * 获取当前应用下的一个模型
     * @param string $model 模型名
     * @return object
     */
    protected function get_model($model = null)
    {
        if ($model === null) $model = $this->controller;
        return bone::get_model($this->app, $model);
    }

    /**
     * 获取当前后台应用下的一个模型
     * @param string $model 模型名
     * @return object
     */
    protected function get_admin_model($model = null)
    {
        if ($model === null) $model = $this->controller;
        return bone::get_admin_model($this->app, $model);
    }

    /**
     * 获取当前应用下的一个模板
     * @param string $name 模板名
     * @return object
     */
    protected function get_template($name = null)
    {
        if ($name === null) $name = $this->task;
        $template = bone::get_template($this->app, $this->controller, $name);
        
        $session = bone::get_session();
        if ($session->has('_message')) $template->set('_message', $session->clear('_message'));
        
        return $template;
    }

    /**
     * 获取当前后台应用下的一个模板
     * @param string $name 模板名
     * @return object
     */
    protected function get_admin_template($name = null)
    {
        if ($name === null) $name = $this->task;
        $template = bone::get_admin_template($this->app, $this->controller, $name);
        
        $session = bone::get_session();
        if ($session->has('_message')) $template->set('_message', $session->clear('_message'));
        
        return $template;
    }

}


